import CryptoJS from 'crypto-js'

export function dateFormat(date, format = 'YYYY-MM-DD hh:mm:ss', timeZone = 'Asia/Shanghai') {
  if (+date === 0 || Number.isNaN(+date)) {
    return '--';
  }

  const d = new Date(+date);

  const options = {
    year: 'numeric', // 可能的值为 "numeric" 和 "2-digit"
    month: '2-digit', // numeric[例如3]，2-digit[例如03]，short[例如Mar]，long[例如March]，narrow[例如S]
    day: '2-digit', // 可能的值为 "numeric" 和 "2-digit"
    hour: '2-digit', // 可能的值为 "numeric" 和 "2-digit"
    minute: '2-digit', // 可能的值为 "numeric" 和 "2-digit"
    second: '2-digit', // 可能的值为 "numeric" 和 "2-digit"
    hour12: false, // 是否使用 12 小时制
    timeZone, // 时区
  };

  const parts = new Intl.DateTimeFormat('en-US', options).formatToParts(d);
  const values = {};

  parts.forEach(({ type, value }) => {
    if (type !== 'literal') {
      if (type === 'hour') {
        // 特殊处理，在不同的浏览器模式下，会返回24:00，统一处理为00:00
        values[type] = value === '24' ? '00' : value;
      } else {
        values[type] = value;
      }
      // values[type] = value;
    }
  });

  return format.replace('YYYY', values.year)
    .replace(/\b(Y)\b/, values.year.slice(2))
    .replace(/MM/, values.month)
    .replace(/\b(M)\b/, values.month)
    .replace(/DD/, values.day)
    .replace(/\b(D)\b/, values.day)
    .replace(/hh/, values.hour)
    .replace(/\b(h)\b/, values.hour)
    .replace(/mm/, values.minute)
    .replace(/\b(m)\b/, values.minute)
    .replace(/ss/, values.second)
    .replace(/\b(s)\b/, values.second);
}

// 转换为周
// timedat ： new Date('2019-10-07')
// string ： '周' || '星期'
export function getWeek(timedat, string = '周') {
  var week
  if (timedat.getDay() === 0) week = string + '日'
  if (timedat.getDay() === 1) week = string + '一'
  if (timedat.getDay() === 2) week = string + '二'
  if (timedat.getDay() === 3) week = string + '三'
  if (timedat.getDay() === 4) week = string + '四'
  if (timedat.getDay() === 5) week = string + '五'
  if (timedat.getDay() === 6) week = string + '六'
  return week
}

// 内参中广告词和业主信息解密方法
export function decryptData({ da, de }) {
  const rawData = CryptoJS.enc.Base64.parse(da);
  const iv = CryptoJS.lib.WordArray.create(rawData.words.slice(0, 4)); // IV固定为16字节，即4个词
  const ciphertext = CryptoJS.lib.WordArray.create(rawData.words.slice(4));

  const keyWordArray = CryptoJS.enc.Base64.parse(de);
  const decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, keyWordArray, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });

  const plaintext = decrypted.toString(CryptoJS.enc.Utf8);
  return JSON.parse(plaintext);
}

/**
 *
 * @param {*} source 源数组
 * @param {*} count 要取出多少项
 * @param {*} isPermutation 是否使用排列的方式
 * @return {any[]} 所有排列组合,格式为 [ [1,2], [1,3]] ...
 */
export function getNumbers(source, count, isPermutation = true) {

  // 如果只取一位，返回数组中的所有项，例如 [ [1], [2], [3] ]
  const currentList = source.map((item) => [item])

  if (count === 1) {
    return currentList
  }
  const result = []
  // 取出第一项后，再取出后面count - 1 项的排列组合，并把第一项的所有可能（currentList）和 后面count-1项所有可能交叉组合
  for (let i = 0; i < currentList.length; i++) {
    const current = currentList[i]
    let children = []
    if (isPermutation) {
      // 如果是排列的方式，在取count-1时，源数组中排除当前项
      children = this.getNumbers(source.filter(item => item !== current[0]), count - 1, isPermutation)
    } else {
      // 如果是组合的方法，在取count-1时，源数组只使用当前项之后的
      children = this.getNumbers(source.slice(i + 1), count - 1, isPermutation)
    }
    for (const child of children) {
      result.push([...current, ...child])
    }
  }
  return result
}

// 去重函数
export function uniqueArray(arr) {
  return Array.from(new Set(arr));
}

// 集合差集
export function minus(array1, array2) {
  return array1.filter(function (value) {
    return array2.indexOf(Number(value)) === -1;
  });
}

export default {
  dateFormat, // 获取当前时间的年月日字符串
  getWeek,
  decryptData,
  getNumbers,
}
